<!DOCTYPE html>
<html>
<head>
    <title>Bootstrap 实例 - 响应式的导航栏</title>
    <meta charset="utf-8">
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/jfcss.css" rel="stylesheet">
    <link href="css/people.css" rel="stylesheet">
    <link href="css/jf-comment.css" rel="stylesheet">
    <script src="js/jquery-3.1.0.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script type="text/javascript" src="js/jquery.goup.min.js"></script>
    <script type="text/javascript" src="js/jframe.js"></script>
    <script type="text/javascript" src="js/jf-comment.js"></script>
    <script type="text/javascript" src="js/login.js"></script>

</head>
<body>
<!--导航栏-->
<nav id="jf-head-nav" class="navbar navbar-default navbar-fixed-top" role="navigation">

</nav>
<!--<div class="well">-->
<!--<div class="container">-->

<!--</div>-->
<!--</div>-->
<!--面包削导航-->

<div class="container">
    <div class="row">
        <div class="col-md-9">
            <div class="art-title">
                <h3>页面标题实例</h3>
                <small>
                    <span class="glyphicon glyphicon-user" aria-hidden="true">&nbsp;</span>
                    <a href="./user-index.html">xiaoTOT</a>
                    <span>创建于&nbsp;2016-12-12</span>

                </small>
            </div>
            <div class="panel">
                <div class="panel-body panel-default">
                    <h2 id="-">背景</h2>
                    <p>有时候我们需要将多个应用部署到一台服务器上(os)，特别是在开发环境。不同的应用需要在有限的机器上得到部署。这样做的好处在于</p>
                    <ol>
                        <li>节约计算机资源，在太机器上模拟正式环境不同服务器协同工作。</li>
                        <li>灵活部署，使得部署目录结构清晰，方便管理。</li>
                    </ol>
                    <h2 id="-">方案</h2>
                    <p>
                        我们希望将不同的应用放在不同的目录下，而且可以分开启动,而不是都放在webapps下使用host:port/${应用名}来区分不同的应用,因为这样部署有一个弊端在于不能分开地启动各应用，启动一个应用的同时其他引用也跟着启动，耗费计算机资源。要想使各个应用可以分开启动，很容易就会想到一个简单的办法。我们同时在机器上安装多个jetty服务器，即一个应用配一个jetty服务器。要启动那个应用，找到相应的jetty服务器启动就好了。接着我们只需要将我们下载的jetty服务器复制几份放在不同的目录，修改jetty.http.port为不同的应用分配不同的监听端口即可。的确这是一个办法，但是本文介绍一种更加优雅的解决方案。</p>
                    <h3 id="how-to-do">how to do</h3>
                    <p>我们完全没有必要复制多份jetty服务器文件。我们实际上可以通过启动时指定参数来实现这个功能。
                        将3个不同应用放在<code>/app/server1/webapps</code> <code>/app/server1/webapps</code> <code>/app/server1/webapps</code>。
                        试看下面几个启动命令</p>
                    <pre><code class="hljs">java -Djetty.logs=/app/server1/logs -Djetty.home=/opt/jetty-<span
                            class="hljs-number">9.2</span>.<span class="hljs-number">12</span> -Djetty.base=/app/server1 -Djava<span
                            class="hljs-class">.io</span><span class="hljs-class">.tmpdir</span>=/app/server1/tmp -jar /opt/jetty-<span
                            class="hljs-number">9.2</span>.<span class="hljs-number">12</span>/start<span
                            class="hljs-class">.jar</span> jetty.state=/app/server1/jetty-ika_open<span
                            class="hljs-class">.state</span> jetty-logging<span class="hljs-class">.xml</span> jetty-started<span
                            class="hljs-class">.xml</span>

java -Djetty.logs=/app/server2/logs -Djetty.home=/opt/jetty-<span class="hljs-number">9.2</span>.<span
                                class="hljs-number">12</span> -Djetty.base=/app/server2 -Djava<span class="hljs-class">.io</span><span
                                class="hljs-class">.tmpdir</span>=/app/server2/tmp -jar /opt/jetty-<span
                                class="hljs-number">9.2</span>.<span class="hljs-number">12</span>/start<span
                                class="hljs-class">.jar</span> jetty.state=/app/server2/jetty-ika_open<span
                                class="hljs-class">.state</span> jetty-logging<span class="hljs-class">.xml</span> jetty-started<span
                                class="hljs-class">.xml</span>

java -Djetty.logs=/app/server3/logs -Djetty.home=/opt/jetty-<span class="hljs-number">9.2</span>.<span
                                class="hljs-number">12</span> -Djetty.base=/app/server3 -Djava<span class="hljs-class">.io</span><span
                                class="hljs-class">.tmpdir</span>=/app/server1/tmp -jar /opt/jetty-<span
                                class="hljs-number">9.2</span>.<span class="hljs-number">12</span>/start<span
                                class="hljs-class">.jar</span> jetty.state=/app/server3/jetty-ika_open<span
                                class="hljs-class">.state</span> jetty-logging<span class="hljs-class">.xml</span> jetty-started.xml
</code></pre>
                    <h3 id="why">why</h3>
                    <p>执行以上命令之后，我们即可完成以上3个应用的部署。观察命令我们实际上jetty-home为同一个j<code>etty.home=/opt/jetty-9.2.12</code>，且运行的jar文件也是同一个。不同在于<code>jetty.base</code>
                        、<code>java.io.tmpdir</code>。
                        我们的应用正在存放的目录位于<code>${jetty.base}/webapps</code>目录下。
                        需要说明的是，为了定义个个应用的监听端口，我们需要在各个<code>${jetty.base}</code>目录下添加start.ini文件。jetty在运行时会读取改文件。
                        至于<code>jetty-logging.xm</code> <code>jetty-started.xml</code>，<code>etty运行时默认去</code>${jetty.home}/etc/<code>寻找。
                            为什么这样就实现了应用的分开部署呢？我们来看看</code>jetty.home<code>。和</code>jetty.base<code>的含义：</code>jetty.home<code>：定义jetty分发的位置，包括他的libs，默认modules和默认XML文件（例如start.jar，lib，等等）</code>jetty.base`：定义一个jetty服务器的特定实例的位置，包括他的配置，logs和web应用（例如start.ini，start.d，logs和webapps）
                        根据以上两个定义很容易理解上面的做法。</p>
                    <h2 id="-">使用脚本部署</h2>
                    <h3 id="how-to-do">how to do</h3>
                    <p>使用命令部署太过繁琐。使用脚本来完成以下事情轻松解决，jetty按照包中已经包含了该脚本。</p>
                    <ul>
                        <li>首先，在${jetty.home}/bin目录下复制多份，分别为server1.sh、server2.sh、server3.sh</li>
                        <li><p>在/etc 或者/etc/default目录下创建文件server1、server2、server3
                            文件做以下记录</p>
                            <blockquote>
                                <p><code>JETTY_HOME=/opt/jetty-9.2.12</code>
                                    <code>JETTY_BASE=/app/server1</code>
                                    <code>TMPDIR=/app/server1/tmp</code>
                                    server2、server3同理。</p>
                            </blockquote>
                        </li>
                        <li><p>创建<code>/app/server1/webapps</code>、<code>/app/server1/logs</code>
                            <code>/app/server1/tmp</code> <code>/app/server1/start.ini</code>。server2,server3同理</p>
                        </li>
                        <li>将各个引用war包放在各个webapps目录下。
                            <pre><code class="hljs">这里输入代码
</code></pre>
                            完成以上步骤后执行
                            执行 <code>/opt/jetty-9.2.12/bin/server1.sh start</code> 与以上通过命令启动的方式等同。
                            <blockquote>
                                <p>我们还可以使用<code>/opt/jetty-9.2.12/bin/server1.sh status</code>来检查我们的配置</p>
                                <h3 id="-why">* why</h3>
                                <p>第一步拷贝sh文件，既然是拷贝那么文件内容必定完全一样，为什么能够启动读取不同配置的作用呢？唯一不同的就是各个sh文件的名称不同罢了，脚本一定在这上面做了文章。
                                    确实如此，看sh文件中以下片段。</p>
                            </blockquote>
                        </li>
                    </ul>
                    <pre><code class="hljs"><span class="hljs-preprocessor"># Configuration files</span>
<span class="hljs-preprocessor">#</span>
<span class="hljs-preprocessor"># /etc/default/$NAME</span>
<span class="hljs-preprocessor">#   If it exists, this is read at the start of script. It may perform any</span>
<span class="hljs-preprocessor">#   sequence of shell commands, like setting relevant environment variables.</span>
<span class="hljs-preprocessor">#</span>
<span class="hljs-preprocessor"># $HOME/.$NAMErc (e.g. $HOME/.jettyrc)</span>
<span class="hljs-preprocessor">#   If it exists, this is read at the start of script. It may perform any</span>
<span class="hljs-preprocessor">#   sequence of shell commands, like setting relevant environment variables.</span>
<span class="hljs-preprocessor">#</span>
<span class="hljs-preprocessor"># /etc/$NAME.conf</span>
<span class="hljs-preprocessor">#   If found, and no configurations were given on the command line,</span>
<span class="hljs-preprocessor">#   the file will be used as this script's configuration.</span>
<span class="hljs-preprocessor">#   Each line in the file may contain:</span>
<span class="hljs-preprocessor">#     - A comment denoted by the pound (#) sign as first non-blank character.</span>
<span class="hljs-preprocessor">#     - The path to a regular file, which will be passed to jetty as a</span>
<span class="hljs-preprocessor">#       config.xml file.</span>
<span class="hljs-preprocessor">#     - The path to a directory. Each *.xml file in the directory will be</span>
<span class="hljs-preprocessor">#       passed to jetty as a config.xml file.</span>
<span class="hljs-preprocessor">#     - All other lines will be passed, as-is to the start.jar</span>
<span class="hljs-preprocessor">#</span>
<span class="hljs-preprocessor">#   The files will be checked for existence before being passed to jetty.</span>
</code></pre>
                    <p>我们使用的是<code>/etc/default/$NAME</code>来配置jetty的环境变量。当然你也可以使用<code>$HOME/.$NAMErc</code>,<code>/etc/$NAME.conf</code>。
                    </p>
                    <h2 id="-">总结</h2>
                    <p>
                        部署多应用的核心实际上是对jetty.base的定制。jetty.base定义一个jetty服务器的特定实例的位置，包括他的配置，logs和web应用（例如start.ini，start.d，logs和webapps）。无论是通过何种方式
                        都是指定了不同的jetty.base来完成应用的分开部署，配置文件（start.ini）的分开配置。使用脚本文件可以方便管理，省去繁琐的命令输入。</p>
                    <pre><code class="hljs"> <span class="hljs-escape">``</span>`
</code></pre>
                    <p>这里输入代码
                        ```</p>
                </div>
            </div><!-- class = 'pannel' -->

            <!--评论输入框-->
            <div id="commentBox" class=" col-md-12" style="margin-top: 50px">
                <!--评论框-->

            </div>

            <!--评论内容-->
            <div id="commentList" class="col-md-12" style="margin-top: 20px">
                <div class="col-md-12">
                    最新评论
                </div>

                <div class="col-md-12" style="border-bottom: 1px gray solid ;margin: 10px 0px"></div>

                <div >

                    <!--评论者头像-->
                    <div class="col-md-1 col-sm-1  hidden-xs">
                        <img src="img/a.jpg" class="jf-user-image">
                    </div>

                    <!--评论内容-->
                    <div class="col-md-11 col-sm-11" style="padding: 0px">
                        <div class="col-md-12" style="padding: 0px">
                            <a href="#">小TOT</a>：博主，同求！！：）。凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字凑够15字
                        </div>

                        <div class="col-md-12"
                             style="background-color: #dcdee8;padding: 10px 0px 10px 20px;margin-top: 10px">
                        <span class="^" style="position: absolute; top:-9px;left:20px">
                           <i style="font-style:normal;color: #dcdee8">◆</i>
                        </span>
                            <a href="#">小YOY</a>：博主，求源码！！：）够15字凑够15字凑够15字够15字凑够15字凑够15字够15字凑够15字凑够15字够15字凑够15字凑够15字够15字凑够15字凑够15字够15字凑够15字凑够15字
                        </div>

                        <!--描述信息-->
                        <div class="col-md-12" style="margin: 10px 0px;padding: 0px;font-size: 13px;color: #c0c2cc">
                            <div class="col-md-3 col-sm-3 col-xs-4" style="padding: 0px">2016-11-26</div>
                            <div class="col-md-3 col-sm-3 col-xs-4 jf-float-right">
                                <a href="#" class="jf-float-right" style="float: right">
                                    <span class="glyphicon glyphicon-thumbs-up" style="font-size: 14px"></span>
                                    <span style="font-size: 13px;color: black">(18)</span>
                                </a>

                                <span class="jf-float-right" style="margin: 0px 3px">|</span>
                                <a href="javascript:0;" class="jf-float-right" style="float: right">回复</a>
                            </div>
                        </div>

                    </div>

                    <hr class="col-md-12 col-sm-12">


                </div>


            </div>
        </div>

        <!--右侧内容-->
        <div class="col-md-3 hidden-sm hidden-xs" >
            <!--作者嘻信息-->
            <!--// class="col-md-12 panel"-->
           <div style="border: gray solid 1px">
               <div style="background: #336699;height: 25px;width: auto;color: white">作者信息</div>
               <img src="./img/d.jpeg" style="height: 70px;width: 70px" class="img-thumbnail">
               <div style="height: 70px;display: inline-block;vertical-align: top;padding: 10px 5px"><span><a href="#">xiaoYOY</a></span>
               <br>
                   这是xiaoYOY的
               </div>
               <button  class="btn-primary bottom-left">关注</button>

           </div>

           <hr>




        </div>

    </div>

</div>



<div class="container" style="margin-top: 100px">
    <footer>
        <div style="text-align: center">
            Copyright © 2016 jframe.cn<br>
            蜀ICP备16009498号
        </div>
    </footer>
</div>

<script>
    function currentUser() {
        return new SimpleUser("-1", "游客", "houme/a", "img/a.jpg")
    }
    $(function () {
        var user = currentUser();
        initCommentBox({
            elementId: "commentBox",
            user: user,
            placeHolder: "这里输入评论吧",
            buttonName: "提交",
        });
    });
</script>

</body>
</html>